#ifndef MYSQL_HANDLER_H
#define MYSQL_HANDLER_H

#include <mysql/mysql.h>

#include <string>
#include <chrono>

namespace DbConnPool
{
    class MysqlHandler
    {
    public:
        // 初始化数据库连接
        MysqlHandler();
        // 释放数据库连接
        ~MysqlHandler();
        // 连接数据库
        bool connect(const std::string &ip, const unsigned short port,
                     const std::string &user, const std::string &password,
                     const std::string dbName);

        // 更新数据库：包括 insert update delete 操作
        bool update(const std::string &sql);
        // 查询数据库
        bool query(const std::string &sql);
        // 遍历查询得到的结果集
        bool next();
        // 得到结果集中的字段值，参数从0开始第几个字段
        std::string getValue(int index);

        // 事务操作，参数true自动提交，false手动提交
        bool useAutoTransaction(bool flag);
        // 提交事务
        bool commit();
        // 事务回滚
        bool rollbock();

        // 刷新起始的空闲时间点，没有在构造或connect()时调用，而是上层调用
        void refreshAliveTime();
        // 计算连接存活的总时长
        long long getAliveTime();

    private:
        void freeResult();

        MYSQL *conn_ = nullptr;

        MYSQL_RES *result_ = nullptr;
        MYSQL_ROW row_ = nullptr;

        // 绝对时钟
        std::chrono::steady_clock::time_point beginTime_;
    };
} // namespace DbConnPool

#endif // MYSQL_HANDLER_H